/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import bean.Autor;
import bean.Editor;
import bean.PeriodicoGS;
import bean.Tema;
import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author fernando
 */
public class PeriodicoGSDao implements Serializable {

    private Conexao conexao;
    private PreparedStatement ps;
    private boolean sucess = false;

    public PeriodicoGSDao() {
        conexao = new ConexaoPostgres();
    }

    public boolean cadastrar(PeriodicoGS periodico) {
        sucess = false;

        try {

            ps = conexao.getConnection().prepareStatement("INSERT INTO periodicos_gs(nome, instituicao_id, descricao, ano_inicio, periodicidade, tipo_publicacao,link) VALUES (?, ?, ?, ?, ?, ?, ?)");
            ps.setString(1, periodico.getNomeRevista());
            ps.setInt(2, periodico.getInstituicao().getId());
            ps.setString(3, periodico.getDescricao());
            ps.setInt(4, periodico.getAnoInicio());
            ps.setString(5, periodico.getPeriodicidade());
            ps.setString(6, periodico.getTipoPublicacao());
            ps.setString(7, periodico.getLink());
            ps.executeUpdate();
            conexao.closeConnection();

            periodico.setId(this.buscarId(periodico));
            Iterator i;
            if (!periodico.getEditores().isEmpty()) {
                i = periodico.getEditores().iterator();
                while (i.hasNext()) {
                    Editor e = (Editor) i.next();
                    ps = conexao.getConnection().prepareStatement("INSERT INTO periodico_editor( id_periodico, id_editor, ano_inicio, ano_fim) VALUES (?, ?, ?, ?)");
                    ps.setInt(1, periodico.getId());
                    ps.setInt(2, e.getEditor().getId());
                    ps.setInt(3, e.getAnoInicio());
                    ps.setInt(4, e.getAnoFim());

                    ps.executeUpdate();
                    conexao.closeConnection();

                }


            }

            if (!periodico.getIndexadores().isEmpty()) {
                i = periodico.getIndexadores().iterator();
                while (i.hasNext()) {
                    String index = (String) i.next();
                    ps = conexao.getConnection().prepareStatement("INSERT INTO periodico_indexador(id_periodico, indexador) VALUES (?, ?)");
                    ps.setInt(1, periodico.getId());
                    ps.setString(2, index);

                    ps.executeUpdate();
                    conexao.closeConnection();

                }
            }

            if (!periodico.getPalavrasChave().isEmpty()) {
                i = periodico.getPalavrasChave().iterator();
                while (i.hasNext()) {
                    Tema pc = (Tema) i.next();
                    ps = conexao.getConnection().prepareStatement("INSERT INTO periodico_palavrachave(id_periodico, id_palavrachave) VALUES (?, ?)");
                    ps.setInt(1, periodico.getId());
                    ps.setInt(2, pc.getId());

                    ps.executeUpdate();
                    conexao.closeConnection();


                }
            }



            sucess = true;
        } catch (SQLException ex) {
            conexao.closeConnection();
            Logger.getLogger(InstituicaoDao.class.getName()).log(Level.SEVERE, null, ex);
            return sucess;
        }

        conexao.closeConnection();
        return sucess;
    }

    public int buscarId(PeriodicoGS periodico) {
        int id = 0;
        try {

            ps = conexao.getConnection().prepareStatement("SELECT id FROM periodicos_gs WHERE nome = ? AND instituicao_id = ? AND descricao = ? AND ano_inicio = ? AND periodicidade = ? AND tipo_publicacao = ? AND link = ? ");
            ps.setString(1, periodico.getNomeRevista());
            ps.setInt(2, periodico.getInstituicao().getId());
            ps.setString(3, periodico.getDescricao());
            ps.setInt(4, periodico.getAnoInicio());
            ps.setString(5, periodico.getPeriodicidade());
            ps.setString(6, periodico.getTipoPublicacao());
            ps.setString(7, periodico.getLink());

            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            while (rs.next()) {
                id = rs.getInt("id");

            }
        } catch (SQLException ex) {
            Logger.getLogger(CursoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        return id;
    }

    public boolean alterar(PeriodicoGS periodico) {
        boolean resultado = false;

        try {
            ps = conexao.getConnection().prepareStatement("UPDATE periodicos_gs SET nome=?, instituicao_id=?, descricao=?, ano_inicio=?, periodicidade=?, tipo_publicacao=?, link=? WHERE id = ? ");
            ps.setString(1, periodico.getNomeRevista());
            ps.setInt(2, periodico.getInstituicao().getId());
            ps.setString(3, periodico.getDescricao());
            ps.setInt(4, periodico.getAnoInicio());
            ps.setString(5, periodico.getPeriodicidade());
            ps.setString(6, periodico.getTipoPublicacao());
            ps.setString(7, periodico.getLink());
            ps.setInt(8, periodico.getId());
            ps.executeUpdate();
            conexao.closeConnection();

            ps = conexao.getConnection().prepareStatement("DELETE FROM periodico_editor WHERE id_periodico = ? ");
            ps.setInt(1, periodico.getId());
            ps.executeUpdate();
            conexao.closeConnection();

            Iterator i;

            if (!periodico.getEditores().isEmpty()) {
                i = periodico.getEditores().iterator();
                while (i.hasNext()) {
                    Editor e = (Editor) i.next();
                    ps = conexao.getConnection().prepareStatement("INSERT INTO periodico_editor( id_periodico, id_editor, ano_inicio, ano_fim) VALUES (?, ?, ?, ?)");
                    ps.setInt(1, periodico.getId());
                    ps.setInt(2, e.getEditor().getId());
                    ps.setInt(3, e.getAnoInicio());
                    ps.setInt(4, e.getAnoFim());

                    ps.executeUpdate();
                    conexao.closeConnection();

                }


            }

            ps = conexao.getConnection().prepareStatement("DELETE FROM periodico_indexador WHERE id_periodico = ? ");
            ps.setInt(1, periodico.getId());
            ps.executeUpdate();
            conexao.closeConnection();

            if (!periodico.getIndexadores().isEmpty()) {
                i = periodico.getIndexadores().iterator();
                while (i.hasNext()) {
                    String index = (String) i.next();
                    ps = conexao.getConnection().prepareStatement("INSERT INTO periodico_indexador(id_periodico, indexador) VALUES (?, ?)");
                    ps.setInt(1, periodico.getId());
                    ps.setString(2, index);

                    ps.executeUpdate();
                    conexao.closeConnection();

                }
            }

            ps = conexao.getConnection().prepareStatement("DELETE FROM periodico_palavrachave WHERE id_periodico = ? ");
            ps.setInt(1, periodico.getId());
            ps.executeUpdate();
            conexao.closeConnection();



            if (!periodico.getPalavrasChave().isEmpty()) {
                i = periodico.getPalavrasChave().iterator();
                while (i.hasNext()) {
                    Tema pc = (Tema) i.next();
                    ps = conexao.getConnection().prepareStatement("INSERT INTO periodico_palavrachave(id_periodico, id_palavrachave) VALUES (?, ?)");
                    ps.setInt(1, periodico.getId());
                    ps.setInt(2, pc.getId());

                    ps.executeUpdate();
                    conexao.closeConnection();


                }
            }

            resultado = true;
        } catch (SQLException ex) {
            Logger.getLogger(CursoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        return resultado;
    }

    public ArrayList<PeriodicoGS> listar() {
        ArrayList<PeriodicoGS> periodicos = new ArrayList<PeriodicoGS>();

        try {

            ps = conexao.getConnection().prepareStatement("SELECT nome, instituicao_id, tipo_publicacao, id FROM periodicos_gs;");
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            while (rs.next()) {
                PeriodicoGS p = new PeriodicoGS();
                p.setId(rs.getInt("id"));
                p.setNomeRevista((rs.getString("nome")));
                p.setInstituicao(new InstituicaoDao().consultaInstituicao(rs.getInt("instituicao_id")));
                p.setTipoPublicacao(rs.getString("tipo_publicacao"));
                p.setEditores(this.buscarEditores(p.getId()));
                periodicos.add(p);


            }
        } catch (SQLException ex) {
            Logger.getLogger(CursoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }


        return periodicos;

    }
    
    public ArrayList<Editor> buscarEditores(int id) {
        ArrayList<Editor> editores = new ArrayList<Editor>();

        try {

            ps = conexao.getConnection().prepareStatement("SELECT id_editor, ano_inicio, ano_fim FROM periodico_editor WHERE id_periodico = ?;");
            ps.setInt(1, id);
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            while (rs.next()) {

                Editor e = new Editor();
                e.setEditor(new AutorDao().consultaAutor(rs.getInt("id_editor")));
                e.setAnoInicio(rs.getInt("ano_inicio"));
                e.setAnoFim(rs.getInt("ano_fim"));

                editores.add(e);

            }
        } catch (SQLException ex) {
            Logger.getLogger(CursoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }


        return editores;

    }

    public ArrayList<String> buscarIndexadores(int id) {
        ArrayList<String> indexadores = new ArrayList<String>();

        try {

            ps = conexao.getConnection().prepareStatement("SELECT indexador FROM periodico_indexador WHERE id_periodico = ?;");
            ps.setInt(1, id);
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            while (rs.next()) {

                String index;
                index = rs.getString("indexador");
                indexadores.add(index);

            }
        } catch (SQLException ex) {
            Logger.getLogger(CursoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }


        return indexadores;

    }

    public ArrayList<Tema> buscarPalavrasChaves(int id) {
        ArrayList<Tema> pChave = new ArrayList<Tema>();

        try {

            ps = conexao.getConnection().prepareStatement("SELECT id_palavrachave FROM periodico_palavrachave WHERE id_periodico = ?;");
            ps.setInt(1, id);
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            while (rs.next()) {

                Tema pc;
                pc = new TemaDao().consultarTema(rs.getInt("id_palavrachave"));
                pChave.add(pc);

            }
        } catch (SQLException ex) {
            Logger.getLogger(CursoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }


        return pChave;

    }

    public PeriodicoGS buscar(int id) {
        PeriodicoGS p = new PeriodicoGS();

        try {

            ps = conexao.getConnection().prepareStatement("SELECT nome, instituicao_id, descricao, ano_inicio, periodicidade, tipo_publicacao, link FROM periodicos_gs WHERE id = ?");
            ps.setInt(1, id);
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            while (rs.next()) {

                p.setId(id);
                p.setNomeRevista((rs.getString("nome")));
                p.setInstituicao(new InstituicaoDao().consultaInstituicao(rs.getInt("instituicao_id")));
                p.setTipoPublicacao(rs.getString("tipo_publicacao"));
                p.setAnoInicio(rs.getInt("ano_inicio"));
                p.setDescricao(rs.getString("descricao"));
                p.setPeriodicidade(rs.getString("periodicidade"));
                p.setTipoPublicacao(rs.getString("tipo_publicacao"));
                p.setLink(rs.getString("link"));
                p.setIndexadores(this.buscarIndexadores(id));
                p.setEditores(this.buscarEditores(id));
                p.setPalavrasChave(this.buscarPalavrasChaves(id));

            }
        } catch (SQLException ex) {
            Logger.getLogger(CursoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }


        return p;

    }

    public ArrayList<String> indexadoresCadastrados() {

        ArrayList<String> indexadores = new ArrayList<String>();

        try {

            ps = conexao.getConnection().prepareStatement("SELECT DISTINCT indexador FROM periodico_indexador");
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            while (rs.next()) {

                String index;
                index = rs.getString("indexador");
                System.out.println("Indexador no Banco: " + index);
                indexadores.add(index);

            }
        } catch (SQLException ex) {
            Logger.getLogger(CursoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }





        return indexadores;


    }
}
